gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringdows/ringtooltip.cpp
/********************************************************************** // // // ########## ###### ######### # ###### # // ############# ########### ######### ######### ### // ######## # ### ## ############# ## ## ##### # #### // #### ## ## ### ### ### # # ##### ##### // # ### # # ## ## ## ## ### // ## ###### ## ## #### #### # # ## // ######### ### ## ### ####### ###### ## ## ### // ###### ## ###### ## ## #### # ## #### // ####### ## ###### ## ### ## ## ### ###### // ######### ## ###### ## ###### ### ## ### # ##### // ## ###### ####### ### #### ## ## ####### ######## ## #### // ## #### ### # ### ### ## ########## ###### ## #### // ## ## ## ######### #### # ## // # ### // ## // ### // ## // // // 临风程序界面类库 ringdows.lib //作者:临风 // //版本:1.0 // //声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到 // 你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在 // 修改的同时给作者一份同样的副本。 // 本类库不得用于任何商业用途,如确实需要,请与作者联系。 // //e-mail:ringphone@sina.com // //原文件名:ringtoolbar.cpp // //本文件说明:提示框实现代码。 // **********************************************************************/ #define MAKE_SELF_LIB #include "ringdows.h" RingToolTip::RingToolTip() { InitBarControl(); m_tiptext = NULL; SetTipStyle(TTF_SUBCLASS); } RingToolTip::~RingToolTip() { LPRINGTIPTEXT curr,save; curr = save = m_tiptext; while(curr) { Del((LPSTR)curr->lpszTip); save = curr; curr = curr->m_next; Del(save); } } //重载RingControls的Create,RingControls::Create始终创建子窗口,而这里需要WS_POPUP BOOL RingToolTip::Create(DWORD dwStyle,DWORD dwExStyle,LPCTSTR szInitText,UINT uId, int x,int y,int width,int height) { if(m_hWnd && IsWindow()) return TRUE; m_ExStyle = dwExStyle & ~RTV_FITPARENTSIZE; m_hWnd = RingCtrlWnd::Create( szInitText, WndClassName(), WS_POPUP | dwStyle, 0,dwExStyle, (HMENU)uId,x,y,width,height); return (BOOL)m_hWnd; } BOOL RingToolTip::Create(DWORD dwStyle/*=TTS_NOPREFIX*/) { return Create(dwStyle,WS_EX_TOPMOST,NULL,0,0,0,0,0); } BOOL RingToolTip::Attach(HWND hWnd) { TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.uFlags = m_dwTipStyle|TTF_IDISHWND; ti.hwnd = m_parent->Handle(); ti.uId = (UINT)hWnd; ti.hinst = GetInstance(); ti.lpszText = LPSTR_TEXTCALLBACK; ::GetClientRect(hWnd,&ti.rect); //MapWindowPoints(hWnd,m_parent->Handle(),(LPPOINT)&ti.rect,2); return ::SendMessage(m_hWnd,TTM_ADDTOOL,0,(LPARAM)&ti); } BOOL RingToolTip::SetPos(int x,int y,int width/*=-999*/,int height/*=-999*/, HWND hPos/* = NULL*/,UINT uFlags/* = SWP_NOZORDER*/) { return ::SendMessage(m_hWnd,TTM_TRACKPOSITION,0,MAKELONG(x,y)); } BOOL RingToolTip::SetValue(int val,int index/*=INDEX_CURSEL*/) { HWND hwnd = GetDlgItem(m_parent->Handle(),index); TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.hwnd = hwnd; ti.uId = (UINT)hwnd; ti.hinst = GetInstance(); ti.lpszText = MAKEINTRESOURCE(val); return ::SendMessage(m_hWnd,TTM_UPDATETIPTEXT,0,(LPARAM)&ti); } BOOL RingToolTip::SetValue(LPCTSTR lpszVal,int index/*=INDEX_CURSEL*/) { HWND hwnd = GetDlgItem(m_parent->Handle(),index); TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.hwnd = hwnd; ti.uId = (UINT)hwnd; ti.hinst = NULL; ti.lpszText = (LPSTR)lpszVal; return ::SendMessage(m_hWnd,TTM_UPDATETIPTEXT,0,(LPARAM)&ti); } LPCTSTR RingToolTip::AddTipText(UINT uId,LPCTSTR lpszText) { if(IS_INTRESOURCE(lpszText) || (LPSTR)lpszText == LPSTR_TEXTCALLBACK) return lpszText; LPRINGTIPTEXT lpTip; if(m_tiptext == NULL) m_tiptext = (LPRINGTIPTEXT)New(sizeof(RINGTIPTEXT)); lpTip = m_tiptext; while(lpTip) { if(lpTip->m_nSize == 0 && lpTip->lpszTip == NULL) { //找到空的 lpTip->m_nSize = (lstrlen(lpszText) + 2) * sizeof(TCHAR); lpTip->lpszTip = (LPCTSTR)New(lpTip->m_nSize); if(lpTip->lpszTip) { lstrcpy((LPSTR)lpTip->lpszTip,lpszText); lpTip->m_id = uId; return lpTip->lpszTip; } else { lpTip->m_nSize = 0; return NULL; } } else { if(lpTip->m_next == NULL) lpTip->m_next = (LPRINGTIPTEXT)New(sizeof(RINGTIPTEXT)); lpTip = lpTip->m_next; } } return NULL; } BOOL RingToolTip::AddTool(HWND hWnd,LPCTSTR lpszTip,LPRECT lprc) { TOOLINFO ti; ti.cbSize = sizeof(TOOLINFO); ti.uFlags = m_dwTipStyle|TTF_IDISHWND; ti.hwnd = m_parent->Handle(); ti.uId = (UINT)hWnd; ti.hinst = GetInstance(); if(IS_INTRESOURCE(lpszTip) || lpszTip == LPSTR_TEXTCALLBACK) ti.lpszText = (LPSTR)lpszTip; else { //复制保存 ti.lpszText = (LPSTR)AddTipText((UINT)hWnd,lpszTip); } if(lprc == NULL) ::GetClientRect(hWnd,&ti.rect); else CopyRect(&ti.rect,lprc); return ::SendMessage(m_hWnd,TTM_ADDTOOL,0,(LPARAM)&ti); } BOOL RingToolTip::AddTool(UINT uId,LPCTSTR lpszTip,LPRECT lprc) { return AddTool(GetDlgItem(m_parent->Handle(),uId),lpszTip,lprc); }